Visualização de dados, documentos dinâmicos e aplicações com R

Thiago Pires | FGV

29 de maio, 2019

Visualização de dados

Visualização de dados

“A visualização de dados consiste na representação gráfica de informações e dados. Usando elementos visuais, como diagramas, gráficos e mapas.”

www.tableau.com

Tipos de gráficos

Pacotes

Alguns pacotes para visualização de dados no R:

  • library(graphics)
  • library(ggplot2)
  • library(plotly)
  • library(leaflet)
  • library(DT)
  • library(crosstalk)
  • library(flexdashboard)
  • library(shiny)

Tipos de variáveis

Conhecer os tipos de variáveis é importante para saber que tipo de gráfico deve ser utilizado.

## Observations: 100
## Variables: 5
## $ Sexo   <fct> Male, Female, Female, Female, Female, Male, Female, Fem...
## $ Ano    <dbl> 2009, 1952, 1990, 1971, 1988, 1981, 1960, 1993, 1967, 1...
## $ Nome   <chr> "Agustin", "Evelyn", "Cynthia", "Letty", "Alyssa", "Ada...
## $ Idade  <dbl> 10, 67, 29, 48, 31, 38, 59, 26, 52, 24, 51, 35, 68, 30,...
## $ Doente <fct> Sim, Não, Sim, Não, Sim, Não, Não, Sim, Sim, Sim, Não, ...

library(graphics)

plot()

Cores

## [1] 657
##  [1] "white"          "aliceblue"      "antiquewhite"   "antiquewhite1" 
##  [5] "antiquewhite2"  "antiquewhite3"  "antiquewhite4"  "aquamarine"    
##  [9] "aquamarine1"    "aquamarine2"    "aquamarine3"    "aquamarine4"   
## [13] "azure"          "azure1"         "azure2"         "azure3"        
## [17] "azure4"         "beige"          "bisque"         "bisque1"       
## [21] "bisque2"        "bisque3"        "bisque4"        "black"         
## [25] "blanchedalmond" "blue"           "blue1"          "blue2"         
## [29] "blue3"          "blue4"

Uma lista de cores no formato hexadecimal poderá ser encontrado em https://www.w3schools.com/colors/colors_picker.asp

plot()

points()

ylim

types

lty

pch e grid()

lwd

curve()

curve(axes = FALSE)

curve(add = TRUE)

abline

hist()

pie()

Exercícios

  • Mostre a relação entre Time e demand utilizando a base de dados BOD.

  • Faça um gráfico utilizando as funções sin (seno) e cos (cosseno) onde o domínio de \(x\) é: \(-5 \leq x \leq 5\).

  • Faça um histograma com os dados do banco de dados WWWusage.

library(ggplot2)

Titanic

## Observations: 891
## Variables: 12
## $ PassengerId <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,...
## $ Survived    <int> 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0,...
## $ Pclass      <int> 3, 1, 3, 1, 3, 3, 1, 3, 3, 2, 3, 1, 3, 3, 3, 2, 3,...
## $ Name        <chr> "Braund, Mr. Owen Harris", "Cumings, Mrs. John Bra...
## $ Sex         <chr> "male", "female", "female", "female", "male", "mal...
## $ Age         <dbl> 22, 38, 26, 35, 35, NA, 54, 2, 27, 14, 4, 58, 20, ...
## $ SibSp       <int> 1, 1, 0, 1, 0, 0, 0, 3, 0, 1, 1, 0, 0, 1, 0, 0, 4,...
## $ Parch       <int> 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 0, 0, 5, 0, 0, 1,...
## $ Ticket      <chr> "A/5 21171", "PC 17599", "STON/O2. 3101282", "1138...
## $ Fare        <dbl> 7.2500, 71.2833, 7.9250, 53.1000, 8.0500, 8.4583, ...
## $ Cabin       <chr> "", "C85", "", "C123", "", "", "E46", "", "", "", ...
## $ Embarked    <chr> "S", "C", "S", "S", "S", "Q", "S", "S", "S", "C", ...

ggplot() + geom_bar()

ggplot() + geom_bar()

ggplot() + geom_bar()

ggplot() + geom_bar()

scale_fill_brewer()

Lista de paletas

scale_fill_manual()

ggplot() + geom_bar() + facet_grid()

ggplot() + geom_boxplot()

ggplot() + geom_boxplot()

ggplot() + geom_boxplot()

ggplot() + geom_boxplot() + facet_grid()

ggplot() + geom_boxplot() + facet_grid()

ggplot() + geom_line()

ggplot() + geom_line()

ggplot() + geom_line()

geom_rect() + geom_text()

geom_text()

Exercícios

  • Gráfico de linhas relacionando faixa etária e taxa de mortalidade do banco VADeaths. (Dica: utilize VADeaths %>% reshape2::melt()).

  • Gráfico de barras utilizando o banco titanic::titanic_train com a variável Embarked.

  • Usar o mesmo banco anterior analisando o número de sobreviventes segundo o porto de embarcação.

  • Analisar com o google trends (gtrendsR) como o termo Lula se distribui de 01-01-2018 à 31-08-2018. Os picos descrevem eventos importantes?

library(wordcloud)

Núvem de palavras

A nuvem de palavras é uma técnica que permite realçar as palavras usadas com mais frequência em um texto.

wordcloud()

wordcloud()

ggwordcloud

ggwordcloud

library(sp)

Mapa de área

## # A tibble: 27 x 3
##    NM_ESTADO        NM_REGIAO    CD_GEOCUF
##    <chr>            <chr>        <chr>    
##  1 ACRE             NORTE        12       
##  2 ALAGOAS          NORDESTE     27       
##  3 AMAPÁ            NORTE        16       
##  4 BAHIA            NORDESTE     29       
##  5 CEARÁ            NORDESTE     23       
##  6 DISTRITO FEDERAL CENTRO-OESTE 53       
##  7 ESPÍRITO SANTO   SUDESTE      32       
##  8 GOIÁS            CENTRO-OESTE 52       
##  9 MARANHÃO         NORDESTE     21       
## 10 MATO GROSSO      CENTRO-OESTE 51       
## # ... with 17 more rows

Mapa de área

Mapa de área

## # A tibble: 27 x 4
##    NM_ESTADO        NM_REGIAO    CD_GEOCUF y              
##    <chr>            <chr>        <chr>     <fct>          
##  1 ACRE             NORTE        12        (-0.935,0.0226]
##  2 ALAGOAS          NORDESTE     27        (-1.9,-0.935]  
##  3 AMAPÁ            NORTE        16        (0.98,1.94]    
##  4 BAHIA            NORDESTE     29        (-0.935,0.0226]
##  5 CEARÁ            NORDESTE     23        (-0.935,0.0226]
##  6 DISTRITO FEDERAL CENTRO-OESTE 53        (-0.935,0.0226]
##  7 ESPÍRITO SANTO   SUDESTE      32        (0.0226,0.98]  
##  8 GOIÁS            CENTRO-OESTE 52        (0.0226,0.98]  
##  9 MARANHÃO         NORDESTE     21        (0.0226,0.98]  
## 10 MATO GROSSO      CENTRO-OESTE 51        (0.98,1.94]    
## # ... with 17 more rows

Mapa de área

library(plotly)

ggplotly()

plot_ly()

plot_ly()

plot_ly()

plot_ly()

plot_ly()

plot_ly(type = pie)

Instituto de Segurança Pública

## Observations: 191
## Variables: 15
## $ vano                    <int> 2003, 2003, 2003, 2003, 2003, 2003, 20...
## $ mes                     <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,...
## $ hom_doloso              <dbl> 4.01, 3.97, 4.17, 3.98, 4.08, 3.72, 3....
## $ lesao_corp_morte        <dbl> 0.04, 0.03, 0.03, 0.07, 0.04, 0.01, 0....
## $ latrocinio              <dbl> 0.14, 0.08, 0.11, 0.10, 0.14, 0.10, 0....
## $ hom_por_interv_policial <dbl> 0.61, 0.76, 0.77, 0.85, 0.65, 0.59, 0....
## $ tentat_hom              <dbl> 2.48, 2.46, 2.26, 2.02, 2.59, 2.15, 2....
## $ lesao_corp_dolosa       <dbl> 46.94, 48.32, 47.43, 43.84, 39.77, 42....
## $ estupro                 <dbl> 1.67, 1.50, 1.61, 1.46, 1.29, 1.35, 1....
## $ hom_culposo             <dbl> 1.11, 1.28, 1.28, 1.41, 1.55, 1.61, 1....
## $ lesao_corp_culposa      <dbl> 21.08, 21.83, 20.37, 20.98, 22.34, 22....
## $ roubo_comercio          <dbl> 4.01, 4.90, 4.36, 4.78, 4.85, 4.38, 5....
## $ roubo_residencia        <dbl> 1.17, 1.16, 1.21, 1.15, 1.28, 0.95, 1....
## $ roubo_veiculo           <dbl> 95.87, 93.49, 85.99, 87.00, 92.62, 78....
## $ roubo_carga             <dbl> 2.43, 3.02, 2.11, 2.06, 2.35, 2.12, 2....

plot_ly(mode = line)

add_trace()

plot_ly(type = box)

heatmap

Exercícios

  • Calcular o percentual das pessoas que embarcaram no Titanic segundo cada porto. Usar gráfico de setores para apresentar os resultados.

  • Mostrar a distribuição de idade comparando os sobreviventes e os que morreram no naufrágio do titanic. Usar boxplots para apresentar os reultados.

Exercícios

  • Seja a matriz produzida com o código abaixo com dados de temperatura (F) segundo dias e meses. Produza um heatmap com estas informações.

Use o heatmap.

library(leaflet)

leaflet()

library(DT)

datatable()

datatable()

library(crosstalk)

Países do mundo

## Observations: 227
## Variables: 20
## $ Country                              <chr> "Afghanistan", "Albania",...
## $ Region                               <chr> "ASIA (EX. NEAR EAST)", "...
## $ Population                           <dbl> 31056997, 3581655, 329300...
## $ `Area (sq. mi.)`                     <dbl> 647500, 28748, 2381740, 1...
## $ `Pop. Density (per sq. mi.)`         <dbl> 48.0, 124.6, 13.8, 290.4,...
## $ `Coastline (coast/area ratio)`       <dbl> 0.00, 1.26, 0.04, 58.29, ...
## $ `Net migration`                      <dbl> 23.06, -4.93, -0.39, -20....
## $ `Infant mortality (per 1000 births)` <dbl> 163.07, 21.52, 31.00, 9.2...
## $ `GDP ($ per capita)`                 <dbl> 700, 4500, 6000, 8000, 19...
## $ `Literacy (%)`                       <dbl> 36.0, 86.5, 70.0, 97.0, 1...
## $ `Phones (per 1000)`                  <dbl> 3.2, 71.2, 78.1, 259.5, 4...
## $ `Arable (%)`                         <dbl> 12.13, 21.09, 3.22, 10.00...
## $ `Crops (%)`                          <dbl> 0.22, 4.42, 0.25, 15.00, ...
## $ `Other (%)`                          <dbl> 87.65, 74.49, 96.53, 75.0...
## $ Climate                              <dbl> 1.0, 3.0, 1.0, 2.0, 3.0, ...
## $ Birthrate                            <dbl> 46.60, 15.11, 17.14, 22.4...
## $ Deathrate                            <dbl> 20.34, 5.22, 4.61, 3.27, ...
## $ Agriculture                          <dbl> 0.380, 0.232, 0.101, NA, ...
## $ Industry                             <dbl> 0.240, 0.188, 0.600, NA, ...
## $ Service                              <dbl> 0.380, 0.579, 0.298, NA, ...

Fonte: https://www.kaggle.com/fernandol/countries-of-the-world

crosstalk

crosstalk

Dados submetidos para análise

Definição do gráfico

crosstalk

Definição da tabela

Layout e geração da saída

Documentos dinâmicos e aplicações

R Markdown

O R possuí um módulo para a criação de documentos (apresentações, relatórios e dashboards), no qual é possível incorporar códigos em R (e outras linguagem) em documentos no formato Markdown, que poderá ser convertido em .html, .pdf ou .doc. Abaixo como mostra a figura, clicando em R Markdown aparecerá as opções para a criação de documentos.

Opções de documento

Em seguida aparece as opções do documento

Escrevendo em Markdown

Formatação de texto

Itálico:  *texto* ou _texto_
Negrito: **texto** ou texto   
Sobrescrito: texto^sobrescrito^
Subscrito: texto~subscrito~
Tachado: ~~texto~~
Títulos e Subtítulos

Título Nível 1:  # Título
Título Nível 2:  ## Título
Título Nível 3:  ### Título
Título Nível 4:  #### Título
Título Nível 5:  ##### Título
Título Nível 6:  ###### Título
Equações

Equação na mesma linha  do texto:  $A = \pi*r^2$
Equação na linha seguinte:  $$A = \pi*r^2$$
Links e Imagens

Links: [link](www.rstudio.com)
Imagens: ![caption_da_imagem](caminho/da/imagem.png)

Listas em Markdown

Ordenadas:

1.  item 1
2.  item 2
-   subitem 1
-   subitem 2

Não-ordenadas:

*   item 1
*   item 2
+ subitem 1
+ subitem 2

Tabelas em Markdown

Tabela:

Coluna 1    | Coluna 2
--------- | --------
Célula 1    | Célula 2
Célula 3    | Célula 4

Tabela com colunas alinhadas:

à esquerda |    centro  | à direita
:--------- | :-----:    | --------:
Célula 1    | Célula 2 | Célula 3
Célula 4    | Célula 5 | Célula 6

Mesclando texto com código

Para criar um chunk, use ```{r} e finalize-o com ```. No caso em que utiliza-se ```{r}, tanto o código, quanto o resultado são apresentados no documento. Quando declara-se ```{r echo=FALSE} o código é omitido.

  • eval determina quais linhas devem ser executadas (default: TRUE são todas)

Mesclando texto com código

  • fig.height e fig.width determinam as dimensões da figura
  • warnings determina se warnings devem ser mostrados (default: TRUE)
  • message determina se mensagens devem ser mostradas (default: TRUE)

Outras opções poderão ser encontradas aqui.

Preâmbulo do documento

Define algumas informações e configurações do documento a ser compilado.

Uma lista de formatos e configurações poderão ser consultadas aqui.

Projeto

  • relatório html (Titanic)

library(flexdashboard)

flexdashboard

O Flexdashboard poderá ser iniciado em: File > New File > R Markdown > From Template

Configurações de layout

Configurações de layout

Outras configurações poderão ser vistas aqui.

Exercício

  • Criar um dashboard com algumas análises

Projeto

  • dashboard (Titanic)

library(shiny)

shiny

Shiny é uma ferramenta desenvolvida pelo RStudio que permite a criação de web aplicações interativas, sem conhecimento prévio de outras linguagens comumente utilizadas na criação de páginas na internet ou aplicativos como, por exemplo, HTML, CSS ou JavaScript. Um tutorial poderá ser acompanhado aqui.

Estrutura

Dois componentes que acompanham a aplicação são:

  • ui: responsável por controlar a aparência da aplicação
  • server: controla todo o processo de funcionamento

Para criar uma nova aplicação shiny deverá ir em: File > New File > Shiny Web App.

Estrutura

Na criação da aplicação existe a opção de trabalhar com um ou multiplos scripts (ui e server separados).

ui

server

Inputs

Inputs

Outputs

Após você capturar informações via inputs, você poderá manipular essas informações no server e produzir resultados que serão apresentados no ui. Para criar um output você precisa utilizar a sintaxe output$nome_output e uma função de renderização de objetos. Veja a seguir alguns exemplos de funções de renderização.

Outputs

  • renderPlot(): cria um output de um plot do R. Deve ser usada em conjunto com a função plotOutput().
  • renderPlotly(): cria um output para gráficos do pacote plotly. Deve ser usada em conjunto com a função plotlyOutput().
  • renderDygraph(): cria um output para gráficos do pacote dygraphs. Deve ser usada em conjunto com a função dygraphOutput().
  • renderPrint(): cria um output para as saídas que são mostradas no console do R.

Outputs

  • renderTable(): cria um output em formato de tabela. Você pode usar essa função, por exemplo, para mostrar data.frame’s ou matrizes. Deve ser usada em conjunto com a função tableOutput().
  • renderText(): cria um output em formato de um vetor de character. Deve ser usada em conjunto com a função textOutput().

Exercício

  • Crie um aplicativo shiny que mostre os seguintes inputs: NOME (texto), IDADE (numérico) e SEXO (radio button).

Após coletar estas informações no ui, use-as para montar as seguintes frases no server e mostrá-las também no ui:

  • se sexo masculino: “Querido NOME, daqui a 2 anos você terá IDADE anos de idade”.
  • se sexo feminino: “Querida NOME, daqui a 2 anos você terá IDADE anos de idade”.

Projetos

  • shiny (ISP)
  • shiny (Form)
  • flexdashboard + shiny (Dengue)

th1460.github.io